import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
import {
	getUserInfo,
	getDoctorId,
	logout,
	getPreMenu,
	getAccountUserList
} from '@/service/api.js'
// 需要永久存储，且下次APP启动需要取出的，在state中的变量名
let saveStateKeys = ['userInfo', 'curAccount'];

// 保存变量到本地存储中
const saveLifeData = function(key, value) {
	// 判断变量名是否在需要存储的数组中
	if (saveStateKeys.indexOf(key) != -1) {
		// 获取本地存储的lifeData对象，将变量添加到对象中
		let tmp = uni.getStorageSync('lifeData');
		// 第一次打开APP，不存在lifeData变量，故放一个{}空对象
		tmp = tmp ? tmp : {};
		tmp[key] = value;
		// 执行这一步后，所有需要存储的变量，都挂载在本地的lifeData对象中
		uni.setStorageSync('lifeData', tmp);
	}
}

const store = new Vuex.Store({
	state: {
		StatusBar: 24,
		CustomBar: 60,
		themeColor: "#36B7AB", //默认颜色
		skin: `
			--nav-bg:#36B7AB;
			--nav-color:#36B7AB;
			--nav-border-color:#36B7AB;
		`,
		userInfo: {},
		permslist: [], //权限菜单
		hasGetMenu: false, //是否获取了菜单
		isLogin: false, //是否登录
		accountList: [], //用户列表
		curAccount: {}, //当前用户
		devicelist: [], //设备列表
		doctorId: ''
	},
	getters: {
		// 全局配置
		themeColor: state => {
			let theme = state.themeColor;
			if (!theme) {
				theme = '#36B7AB';
			}
			return theme;
		},

	},
	mutations: {
		$uStore(state, payload) {
			// console.log('payload', JSON.stringify(payload))
			// 判断是否多层级调用，state中为对象存在的情况，诸如user.info.score = 1
			let nameArr = payload.name.split('.');
			let saveKey = '';
			let len = nameArr.length;
			if (nameArr.length >= 2) {
				let obj = state[nameArr[0]];
				for (let i = 1; i < len - 1; i++) {
					obj = obj[nameArr[i]];
				}
				obj[nameArr[len - 1]] = payload.value;
				saveKey = nameArr[0];
			} else {
				// 单层级变量，在state就是一个普通变量的情况
				state[payload.name] = payload.value;
				saveKey = payload.name;
			}
			// 保存变量到本地，见顶部函数定义
			saveLifeData(saveKey, state[saveKey])

		},
		SET_StatusBar(state, StatusBar) {
			state.StatusBar = StatusBar || 24;
		},
		SET_CustomBar(state, CustomBar) {
			state.CustomBar = CustomBar || 60;
		},

	},
	actions: {
		getUserInfo({
			commit,
			dispatch,
			state
		}) {
			return getUserInfo().then(da => {
				console.log('da', da)
				if (da) {
					let userInfo = da;
					commit('$uStore', {
						name: 'userInfo',
						value: userInfo
					})
					getDoctorId().then(da => {
						commit('$uStore', {
							name: 'doctorId',
							value: da
						})
					})
					return userInfo
				}
				return null
			})
		},
		Logout({
			commit,
			state
		}) {
			return new Promise((resolve) => {
				logout().then(da => {
					commit('$uStore', {
						name: 'isLogin',
						value: false
					})
					let page = uni.$u.page();
					if (page != '/pages/login/login') {
						uni.reLaunch({
							url: '/pages/login/login'
						});
					}
				}).finally(() => {
					uni.clearStorageSync();
				});
			})
		},
		getPreMenu({
			commit,
			state
		}) {
			return new Promise((resolve, reject) => {
				// getPreMenu().then(da => {
				// 	let menulist = da;
				// 	let permslist = [];
				// 	if (menulist && menulist.length > 0) {
				// 		/* 获取权限列表 */
				// 		permslist = JSON.stringify(menulist).match(
				// 				/(?=\"perms\":")([^\,]*)(?=\,)/g)
				// 			.join(',').replace(
				// 				/"perms":/g,
				// 				'').replace(/\"/g, '').split(',');
				// 	}
				// 	commit('$uStore', {
				// 		name: 'permslist',
				// 		value: permslist
				// 	})
				// 	commit('$uStore', {
				// 		name: 'hasGetMenu',
				// 		value: true
				// 	})
				// 	resolve(permslist)
				// }).catch(() => {
				// 	reject()
				// });

			})
		}
	},
	modules: {

	},
})

// 从缓存中取得相同的key进行覆盖操作
let lifeData = uni.getStorageSync('lifeData') || {};
for (let key in lifeData) {
	if (store.state.hasOwnProperty(key)) {
		store.commit('$uStore', {
			name: key,
			value: lifeData[key] || null
		})
	}
}

export default store;